//编码控制器
module code_cntrl(
//时钟复位
i_clk,
i_rst_n,
//编码使能
i_code_en,
//编码数据
i_code_p1,
i_code_p2,
//编码完成
o_code_finish,
//编码控制计数器
o_code_cnt,
//输出地址数据
o_code_addr,
o_code_final_data
);

//时钟复位
input              i_clk;
input              i_rst_n;
//编码使能
input              i_code_en;
//编码数据
input      [31:0]  i_code_p1;
input      [31:0]  i_code_p2;
//编码完成
output reg         o_code_finish;
//编码控制计数器
output reg [8:0]   o_code_cnt;
//输出地址数据
output     [8:0]   o_code_addr;
output     [31:0]  o_code_final_data;

//编码控制计数器
always @(posedge i_clk or negedge i_rst_n)
if(!i_rst_n)begin
    o_code_cnt <= 9'b0;
end
else if(i_code_en)begin
    if(o_code_cnt == 9'd288)begin
        o_code_cnt <= o_code_cnt;
    end
    else begin
        o_code_cnt <= o_code_cnt + 1'b1;
    end
end
else begin
    o_code_cnt <= 9'b0;
end

//编码完成
always @(posedge i_clk or negedge i_rst_n)
if(!i_rst_n)begin
    o_code_finish <= 1'b0;
end
else if(i_code_en)begin
    if(o_code_cnt >= 9'd257)begin
        o_code_finish <= 1'b1;
    end
    else begin
        o_code_finish <= o_code_finish;
    end
end
else begin
    o_code_finish <= 1'b0;
end

assign o_code_addr       = (o_code_cnt - 9'd257);
assign o_code_final_data = (o_code_addr <= 9'd23)?i_code_p1:i_code_p2;

endmodule